package com.example.demo.component;

import com.example.demo.config.RedisTemplateBean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.jms.core.JmsMessagingTemplate;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;

import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.List;

/**
 * 定时把redis列表里的访问记录批量抽取出来推到Queue
 */
@Configuration      //1.主要用于标记配置类，兼备Component的效果。
//@EnableScheduling   // 2.开启定时任务
public class ArticleVisitBatchInsertTask {

    @Resource
    RedisTemplateBean redisTemplateBean;
    @Resource
    JmsMessagingTemplate jmsMessagingTemplate;

    protected Long currentSecond;

    //3.添加定时任务
    @Scheduled(cron = "0/5 * * * * ?")
    //或直接指定时间间隔，例如：5秒
    @Scheduled(fixedRate=5000)
    private void configureTasks() {
        String redisKey = "articleVisit";
        RedisTemplate redisTemplate = redisTemplateBean.redisTemplate();

        // 设置结束秒数，跑50秒
        Long endSecond = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8")) + 10;
        // 获取当前时间
        this.currentSecond = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8"));

        do{

            // 如果redis key不存在则直接退出
            if (! redisTemplate.hasKey("articleVisit")){
                break;
            }
            // 每循环一次更新一次当前时间
            this.currentSecond = LocalDateTime.now().toEpochSecond(ZoneOffset.of("+8"));

            // 从左边开始拿列表的里面的100条数据
            List<String> redisList = redisTemplate.opsForList().range(redisKey, 0, 99);

            jmsMessagingTemplate.convertAndSend("batchInsertArticleVisitQueue", redisList.toString());
            // （裁剪）保留指定范围内的数据
            redisTemplate.opsForList().trim(redisKey, 100, -1);

        }while (this.currentSecond < endSecond);

    }
}